<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
          Google Web Toolkit
          
            -
            Serializable Types</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<link href="../css/base.css" rel="stylesheet" type="text/css">
<link href="./doc.css" rel="stylesheet" type="text/css">
<link href="../css/print.css" rel="stylesheet" media="print" type="text/css">
</head>
<body>
<div id="gaia">&nbsp;</div>
<div id="header">
<div id="logo">
<a href="http://code.google.com/"><img src="http://code.google.com/images/code_sm.png" alt="Google"></a>
</div>
<div id="title">Google Web Toolkit (Beta)</div>
<div id="breadcrumbs">
<div id="nextprev">
<nobr><a href="com.google.gwt.doc.DeveloperGuide.RemoteProcedureCalls.MakingACall.html">&laquo; prev</a></nobr><nobr><a href="com.google.gwt.doc.DeveloperGuide.RemoteProcedureCalls.HandlingExceptions.html">next &raquo;</a></nobr>
</div>
<span class="item"><a href="http://code.google.com/">Google Code Home</a></span>
        &gt;
        <span class="item"><a href="http://code.google.com/webtoolkit/">Google Web Toolkit</a></span>
        &gt;
        
        <span class="item"><a xmlns="" href="com.google.gwt.doc.DeveloperGuide.html">Developer Guide</a></span> &gt;
						<span class="item"><a href="com.google.gwt.doc.DeveloperGuide.RemoteProcedureCalls.html">Remote Procedure Calls</a></span> &gt;
						<span class="selected item">Serializable Types</span>
</div>
</div>
<div id="side">
<div id="menu">
<h4>
<a href="http://code.google.com/webtoolkit/">Google Web Toolkit</a>
</h4>
<ul>
<li>
<a href="http://code.google.com/webtoolkit/download.html">Download GWT</a>
</li>
</ul>
<ul>
<li>
<a href="http://code.google.com/webtoolkit/overview.html">Product Overview</a>
</li>
<li>
<a href="http://code.google.com/webtoolkit/gettingstarted.html">Getting Started Guide</a>
</li>
<li>
<a href="http://code.google.com/webtoolkit/documentation/examples/">Example Projects</a>
</li>
</ul>
<ul>
<li>
<a class="selected" href="./com.google.gwt.doc.DeveloperGuide.html">Developer Guide</a>
</li>
<li>
<a href="./gwt.html">Class Reference</a>
</li>
<li>
<a href="http://code.google.com/webtoolkit/issues/">Issue Tracking</a>
</li>
<li>
<a href="http://groups.google.com/group/Google-Web-Toolkit">Developer Forum</a>
</li>
</ul>
<ul>
<li>
<a href="http://googlewebtoolkit.blogspot.com/">GWT Blog</a>
</li>
<li>
<a href="http://code.google.com/webtoolkit/faq.html">GWT FAQ</a>
</li>
<li>
<a href="http://code.google.com/webtoolkit/makinggwtbetter.html">Making GWT Better</a>
</li>
</ul>
<ul>
<li>
<a href="http://code.google.com/webtoolkit/thirdparty.html">Third Party Tools</a>
</li>
</ul>
</div>
<div id="search">
<form action="http://www.google.com/search" method="get">
<div>
<input name="domains" value="code.google.com" type="hidden"><input name="sitesearch" value="code.google.com" type="hidden">
<div class="header">Search this site:</div>
<div class="input">
<input name="q" size="10">
</div>
<div class="button">
<input value="Search" type="submit">
</div>
</div>
</form>
</div>
</div>
<div xmlns="http://www.w3.org/1999/xhtml" id="body">
<h1>Serializable Types</h1>Method parameters and return types must be <i>serializable</i>, which
 means they must conform to certain restrictions. GWT tries really hard to
 make serialization as painless as possible, so while the rules regarding
 serialization are subtle, in practice the behavior becomes intuitive very
 quickly.
 
 <p>
 A type is serializable and can be used in a service interface if it
 <ul>
<li>is primitive, such as <code>char</code>, <code>byte</code>,
 <code>short</code>, <code>int</code>, <code>long</code>,
 <code>boolean</code>, <code>float</code>, or <code>double</code>;</li>
<li>is <code>String</code>, <code>Date</code>, or a primitive
 wrapper such as <code>Character</code>, <code>Byte</code>,
 <code>Short</code>, <code>Integer</code>, <code>Long</code>,
 <code>Boolean</code>, <code>Float</code>, or <code>Double</code>;</li>
<li>is an array of serializable types (including other serializable
 arrays);</li>
<li>is a serializable user-defined class; or</li>
<li>has at least one serializable subclass</li>
</ul>
</p>
<h2>Serializable User-defined Classes</h2>
 A user-defined class is serializable if
 <ol>
<li>it is assignable to
 <a xmlns="" href="com.google.gwt.user.client.rpc.IsSerializable.html">IsSerializable</a>, either because it
 directly implements the interface or because it derives from a superclass
 that does, and </li>
<li>all non-<code>transient</code> fields are themselves
 serializable.</li>
</ol>
 
 The <code>transient</code> keyword is honored, so values in transient
 fields are not exchanged during RPCs. Fields that are declared
 <code>final</code> are also not exchanged during RPCs, so they should
 generally be marked <code>transient</code> as well.
 
 <h2>Polymorphism</h2>
 GWT RPC supports polymorphic parameters and return types. To make the
 best use of polymorphism, however, you should still try to be as specific
 as your design allows when defining service interfaces. Increased
 specificity allows the
 <a href="com.google.gwt.doc.DeveloperGuide.Fundamentals.JavaToJavaScriptCompiler.html">compiler</a> to
 do a better job of removing unnecessary code when it optimizes your
 application for size reduction.
 
 <h2>Type Arguments</h2>
 Collection classes such as <code>java.util.Set</code> and
 <code>java.util.List</code> are tricky because they operate in terms of
 <code>Object</code> instances. To make collections serializable, you
 should specify the particular type of objects they are expected to
 contain. This requires you to use the special Javadoc annotation
 <code>@gwt.typeArgs</code>. Defining an <i>item type</i> for a
 collection means that you will ensure that the collection only ever
 contains objects of that item type or a subclass thereof. This hint is
 necessary so that the GWT proxy generator can create efficient code.
 Adding an object to a collection that violates its asserted item type
 will lead to undefined behavior.
 
 <p>
 To annotate fields of collection type in a serializable user-defined
 class:
 
 <pre class="code">public class MyClass implements IsSerializable {
  /**
   * This field is a Set that must always contain Strings.
   * 
   * @gwt.typeArgs &lt;java.lang.String&gt;
   */
  public Set setOfStrings;

  /**
   * This field is a Map that must always contain Strings as its keys and
   * values.
   * 
   * @gwt.typeArgs &lt;java.lang.String,java.lang.String&gt;
   */
  public Map mapOfStringToString;
}
</pre>

 
 Note that there is no need to specify the name of the field in the
 <code>@gwt.typeArgs</code> declaration since it can be inferred.
 </p>
<p>
 Similarly, to annotate parameters and return types:
 
 <pre class="code">public interface MyService extends RemoteService {
  /**
   * The first annotation indicates that the parameter named 'c' is a List
   * that will only contain Integer objects. The second annotation
   * indicates that the returned List will only contain String objects
   * (notice there is no need for a name, since it is a return value).
   * 
   * @gwt.typeArgs c &lt;java.lang.Integer&gt;
   * @gwt.typeArgs &lt;java.lang.String&gt;
   */
  List reverseListAndConvertToStrings(List c);
}
</pre>

 
 Note that parameter annotations must include the name of the parameter
 they are annotating in addition to the collection item type, while return
 type annotations do not.
 </p>
<div class="tipContainer" xmlns="http://www.w3.org/1999/xhtml">
<div class="tipCallout">Tip</div>
<div class="tipBody">Although the terminology is very similar, GWT's concept of
      "serializable" is different than serialization based on the standard
      Java interface
      <code><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html">Serializable</a></code>.
      All references to serialization are referring to the GWT concept as
      defined below.</div>
</div>
</div>
<div id="footer">
          &copy;2007 Google
          <span class="noprint">
            -
            <a href="http://www.google.com/">Google Home</a>
            -
            <a href="http://www.google.com/jobs/">We're Hiring</a>
            -
            <a href="http://www.google.com/privacy.html">Privacy Policy</a>
            -
            <a href="http://www.google.com/terms_of_service.html">Terms of Service</a>
            -
            <a href="mailto:code@google.com">Contact Us</a></span>
<div id="license" style="text-align: center; margin: 1em 0em 1em 0em">
            Except as otherwise
            <a href="http://code.google.com/policies.html#restrictions">noted</a>, the content of this  page is licensed under the  <a rel="license" href="http://creativecommons.org/licenses/by/2.5/">Creative Commons Attribution 2.5 License</a>.
              <!--
            <rdf:RDF xmlns="http://web.resource.org/cc/">
<Work rdf:about="">
<license rdf:resource="http://creativecommons.org/licenses/by/2.5/"></license>
</Work>
<License rdf:about="http://creativecommons.org/licenses/by/2.5/">
<permits rdf:resource="http://web.resource.org/cc/Reproduction"></permits>
<permits rdf:resource="http://web.resource.org/cc/Distribution"></permits>
<requires rdf:resource="http://web.resource.org/cc/Notice"></requires>
<requires rdf:resource="http://web.resource.org/cc/Attribution"></requires>
<permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"></permits>
</License>
</rdf:RDF>
              -->
            </div>
</div>
<script src="https://ssl.google-analytics.com/urchin.js" type="text/javascript" xmlns="http://www.w3.org/1999/xhtml"></script><script type="text/javascript">
          _uacct="UA-18071-1"; _uanchor=1; urchinTracker();
        </script>
</body>
</html>
